package org.fu.crowd.utils;

import com.aliyun.api.geteway.demo.util.HttpUtils;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.comm.ResponseMessage;
import com.aliyun.oss.model.PutObjectResult;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.fu.crowd.constant.CrowdConstant;

import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 通用工具方法类
 */
public class CrowdUtils {


    /**
     *                  手机验证码发送
     * @param phoneNum  接收验证码的手机号
     * @return      返回调用结果是否成功，以及调用失败的消息
     *          1204:签名未报备    1205:签名不可用
     *          1302:短信内容包含敏感词
     *          1304:短信内容过长
     *          1320:模板ID不存在
     *          1403:手机号码不正确
     *          1905:验证未通过
     *
     */
    public static Common<String> sendCodeShortMessage(String phoneNum){

        //短信接口调用的url地址
        String host = "https://gyytz.market.alicloudapi.com";
        // 具体发送短信的地址
        String path = "/sms/smsSend";
        //请求方式
        String method = "POST";
        //在阿里云自己的控制台上可以看见商家给出的appcode
        //  fb3b5f018cc644f7b00a8c61057af058
        String appcode = "fb3b5f018cc644f7b00a8c61057af058";

        Map<String, String> headers = new HashMap<String, String>();
        //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
        headers.put("Authorization", "APPCODE " + appcode);

        //封装其他参数
        Map<String, String> querys = new HashMap<>();
        //要发送的验证码
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0 ; i < 4 ; i++){
            int random = (int)(Math.random()*10);
            stringBuilder.append(random);
        }
        querys.put("mobile", phoneNum);//手机号
        querys.put("param", "**code**:"+stringBuilder+",**minute**:5");
        querys.put("smsSignId", "931e4ab6cff2491ca4777fb439743dcc");//短信前缀id,签名Id
        querys.put("templateId", "305b8db49cdb4b18964ffe255188cb20");//短信正文id，模板
        Map<String, String> bodys = new HashMap<>();


        try {
            HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
            //获取response的body
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            String reasonPhrase = statusLine.getReasonPhrase();
            System.out.println("已发送");
            if (statusCode==200){
                return Common.successWithoutData(stringBuilder.toString());
            }
            return Common.failed(reasonPhrase);
//            System.out.println(EntityUtils.toString(response.getEntity()));

        } catch (Exception e) {
            e.printStackTrace();
            return Common.failed(e.getMessage());
        }

    }














    /**
     * 判断当前请求是否为ajax请求
     * @param request
     * @return
     */
    public static boolean judgeRequestType(HttpServletRequest request){
        //获取请求消息头
        String header = request.getHeader("X-Requested-With");
        return header!=null&&header.contains("XMLHttpRequest");
    }


    /**
     *  MD5加密算法
     */
    public static String md5(String source){
        if (source==null||source.length()==0){
            throw new RuntimeException(CrowdConstant.MESSAGE_STRING_INVALIDATE);
        }

        try {
            String algorithm= "md5";
            MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
            byte[] input = source.getBytes();
            byte[] output = messageDigest.digest(input);
            int sigNum = 1;
            BigInteger bigInteger = new BigInteger(sigNum,output);
            //转化成16进制
            int radix = 16;
            String encoded = bigInteger.toString(radix).toUpperCase();

            return encoded;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }








    /**
     * 专门负责上传文件到 OSS 服务器的工具方法
     * @param endpoint OSS 参数
     * @param accessKeyId OSS 参数
     * @param accessKeySecret OSS 参数
     * @param inputStream 要上传的文件的输入流
     * @param bucketName OSS 参数
     * @param bucketDomain OSS 参数
     * @param originalName 要上传的文件的原始文件名
     * @return 包含上传结果以及上传的文件在 OSS 上的访问路径
     */
    public static Common<String> uploadFileToOss(
            String endpoint, String accessKeyId, String accessKeySecret,
            InputStream inputStream, String bucketName, String bucketDomain, String originalName
    ) {

        // 创建 OSSClient 实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 生成上传文件的目录
        String folderName = new SimpleDateFormat("yyyyMMdd").format(new Date());
        // 生成上传文件在 OSS 服务器上保存时的文件名
        // 原始文件名：beautfulgirl.jpg
        // 生成文件名：wer234234efwer235346457dfswet346235.jpg
        // 使用 UUID 生成文件主体名称
        String fileMainName = UUID.randomUUID().toString().replace("-", "");
        // 从原始文件名中获取文件扩展名
        String extensionName = originalName.substring(originalName.lastIndexOf("."));
        // 使用目录、文件主体名称、文件扩展名称拼接得到对象名称
        String objectName = folderName + "/" + fileMainName + extensionName;
        try {
            // 调用 OSS 客户端对象的方法上传文件并获取响应结果数据
            PutObjectResult putObjectResult = ossClient.putObject(bucketName, objectName, inputStream);
            // 从响应结果中获取具体响应消息
            ResponseMessage responseMessage = putObjectResult.getResponse();
            // 根据响应状态码判断请求是否成功
            if (responseMessage == null) {
                // 拼接访问刚刚上传的文件的路径
                String ossFileAccessPath = bucketDomain + "/" + objectName;
                // 当前方法返回成功
                return Common.successWithoutData(ossFileAccessPath);
            } else {
                // 获取响应状态码
                int statusCode = responseMessage.getStatusCode();
                // 如果请求没有成功，获取错误消息
                String errorMessage = responseMessage.getErrorResponseAsString();
                // 当前方法返回失败
                return Common.failed(" 当 前 响 应 状 态 码 =" + statusCode + " 错误消息=" + errorMessage);
            }
        } catch (Exception e) {
            e.printStackTrace();
                // 当前方法返回失败
            return Common.failed(e.getMessage());
        } finally {
            if (ossClient != null) {
                // 关闭 OSSClient。
                ossClient.shutdown();
            }
        }
    }







}
